package es.udc.fbellas.j2ee.tiendaweb.model.producto.DAO;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

import es.udc.fbellas.j2ee.tiendaweb.model.categoria.DAO.SQLCategoriaDAO;
import es.udc.fbellas.j2ee.tiendaweb.model.categoria.DAO.SQLCategoriaDAOFactory;
import es.udc.fbellas.j2ee.tiendaweb.model.categoria.TO.CategoriaTO;
import es.udc.fbellas.j2ee.tiendaweb.model.producto.TO.ProductoTO;
import es.udc.fbellas.j2ee.util.exceptions.InternalErrorException;
import es.udc.fbellas.j2ee.util.sql.GeneralOperations;

/**
 * An implementation of <code>SQLAccountDAO</code> for databases providing
 * counter columns with JDBC 3 drivers.
 */
public class SQLProductoDAO {

/* comprobar si existe una producto por su id en la tabla de la BD */

    public boolean exists(Connection connection, int idProducto) 
        throws InternalErrorException {
        
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        try {

            /* Create "preparedStatement". */
            String queryString = "SELECT IDPRODUCTO FROM PRODUCTO WHERE IDPRODUCTO = ?";
            preparedStatement = connection.prepareStatement(queryString);
            
            /* Fill "preparedStatement". */
            int i = 1;
            preparedStatement.setInt(i++, idProducto);
            
            /* Execute query. */
            resultSet = preparedStatement.executeQuery();

            return resultSet.next();
            
        } catch (SQLException e) {
            throw new InternalErrorException(e);    
        } finally {
            GeneralOperations.closeResultSet(resultSet);
            GeneralOperations.closeStatement(preparedStatement);
        }
        
    }



/* encontrar una producto a partir de su id */

    public ProductoTO find(Connection connection, int idProducto) 
        throws InternalErrorException {
        
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
    
        try {
                
            /* Create "preparedStatement". */
            String queryString = "SELECT IDPRODUCTO,NOMBRE, PRECIO, FECHAALTA, STOCK, IDCATEGORIA FROM PRODUCTO WHERE IDPRODUCTO = ?";
            preparedStatement = connection.prepareStatement(queryString);    
            
            /* Fill "preparedStatement". */
            int i = 1;
            preparedStatement.setInt(i++,idProducto);
                                    
            /* Execute query. */
			resultSet = preparedStatement.executeQuery();

            if (!resultSet.next()) {
                throw new InternalErrorException(new SQLException(
                    "No hay ninguna producto con ese id."));
            }

			/* get result */
			i = 1;
			int idProd=resultSet.getInt(i++);
			String nombreProducto= resultSet.getString(i++);
		    int precio=resultSet.getInt(i++);
			Date fechaAlta=resultSet.getDate(i++);
			int stock=resultSet.getInt(i++);
			int categoria=resultSet.getInt(i++);

		    return new ProductoTO(idProd,nombreProducto ,precio,fechaAlta,stock,categoria );
        
        } catch (SQLException e) {
            throw new InternalErrorException(e);
        } finally {
            GeneralOperations.closeStatement(preparedStatement);
			GeneralOperations.closeResultSet(resultSet);
        }
        
    }



/* encontrar una lista de productos de un idCategoria */

    public List<ProductoTO> findByNombre(Connection conexion, String nombre, int inicio, int cont) 
        throws InternalErrorException {
        

        
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        try {

            StringTokenizer tokenizer = new StringTokenizer(nombre);
            
            String sentencia=" UPPER(nombre) like UPPER('%";
            while (tokenizer.hasMoreTokens()){
                
                sentencia = sentencia + tokenizer.nextToken()+"%')";
                if (tokenizer.hasMoreTokens()){
                    sentencia = sentencia +" AND UPPER(nombre) like UPPER( '%";
                }
            }
            
            
            
            /* Create "preparedStatement". */
   
            String queryString = "SELECT IDPRODUCTO,NOMBRE, PRECIO, FECHAALTA, STOCK, IDCATEGORIA" +
            " FROM PRODUCTO WHERE" +
            sentencia;
            preparedStatement = conexion.prepareStatement(queryString);

        	
            /* Fill "preparedStatement". */
            int i = 1;
            //preparedStatement.setString(i++, sentencia);
            
                                
            /* Execute query. */
            resultSet = preparedStatement.executeQuery();

            /* Read objects. */
            List<ProductoTO> productoTOs = new ArrayList<ProductoTO>();
            int contador = 0;
            
            if ((inicio >=1) && resultSet.absolute(inicio)) {
            
                do {

                    i = 1;
          
                    int idProducto = resultSet.getInt(i++);
                	String nombreProducto= resultSet.getString(i++);
                    int precio=resultSet.getInt(i++);
                    Date fechaAlta = resultSet.getDate(i++);
                	int stock=resultSet.getInt(i++);
                	int categoria=resultSet.getInt(i++);
                    
                    SQLCategoriaDAO dao = SQLCategoriaDAOFactory.getDAO();
                    CategoriaTO categoriaTO = dao.find(conexion, categoria);
                    
                
					productoTOs.add(new ProductoTO(idProducto,nombreProducto ,precio,fechaAlta,stock,categoria ));

					contador++;

                
                } while (resultSet.next() && (contador < cont)) ;
                
            }

            /* Return value objects. */                
            return productoTOs;
            
        } catch (SQLException e) {
            throw new InternalErrorException(e);    
        } finally {
            GeneralOperations.closeResultSet(resultSet);
            GeneralOperations.closeStatement(preparedStatement);
        }
        
    }
    
    
    
    /* encontrar una lista de productos de un nombre de producto con su categoria */

    public List<ProductoTO> findByNombreCategoria(Connection conexion, String nombre,int idCategoria, int inicio, int cont) 
            throws InternalErrorException {
            
            PreparedStatement preparedStatement = null;
            ResultSet resultSet = null;
        
            try {
                    
                StringTokenizer tokenizer = new StringTokenizer(nombre);
                
                String sentencia=" UPPER(nombre) like UPPER('%";
                while (tokenizer.hasMoreTokens()){
                    
                    sentencia = sentencia + tokenizer.nextToken()+"%')";
                    if (tokenizer.hasMoreTokens()){
                        sentencia = sentencia +" AND UPPER(nombre) like UPPER( '%";
                    }
                }
                
                

                SQLCategoriaDAO dao = SQLCategoriaDAOFactory.getDAO();
                CategoriaTO categoriaTO = dao.find(conexion, idCategoria);
                
                /* Create "preparedStatement". */
    
                String queryString = "SELECT IDPRODUCTO,NOMBRE, PRECIO, FECHAALTA, STOCK, IDCATEGORIA" +
                " FROM PRODUCTO WHERE" +
	            " IDCATEGORIA = ?" + " AND " + sentencia;
	            preparedStatement = conexion.prepareStatement(queryString);

            	
                /* Fill "preparedStatement". */
                int i = 1;
                preparedStatement.setInt(i++, idCategoria);
                //preparedStatement.setString(i++, sentencia);
                                    
                /* Execute query. */
                resultSet = preparedStatement.executeQuery();

                /* Read objects. */
                List<ProductoTO> productoTOs = new ArrayList<ProductoTO>();
                int contador = 0;
                
                if ((inicio >=1) && resultSet.absolute(inicio)) {
                
                    
                    do {

                    	  i = 1;
                          
                    	int idProducto = resultSet.getInt(i++);
                      	String nombreProducto= resultSet.getString(i++);
                        int precio=resultSet.getInt(i++);
                        Date fechaAlta = resultSet.getDate(i++);
                      	int stock=resultSet.getInt(i++);
                      	int categoria=resultSet.getInt(i++);
                
      					productoTOs.add(new ProductoTO(idProducto,nombreProducto ,precio,fechaAlta,stock,categoria ));

      					contador++;
 
                    } while (resultSet.next() && (contador < cont)) ;
                    
                }

                /* Return value objects. */                
                return productoTOs;
            } catch (SQLException e) {
                throw new InternalErrorException(e);
            } finally {
    			GeneralOperations.closeResultSet(resultSet);
                GeneralOperations.closeStatement(preparedStatement);
            }
            
        }
    
    public void actualizaStock(Connection connection, int idProducto, int nStock) 
    throws InternalErrorException {
        try {
        PreparedStatement preparedStatement = null;
           
        preparedStatement = connection.prepareStatement("UPDATE PRODUCTO " +
                    "SET STOCK = ? WHERE IDPRODUCTO = ? ");
            preparedStatement.setInt(1,idProducto);
            preparedStatement.setInt(2,nStock);
            if (preparedStatement.executeUpdate()!=1)
                throw new SQLException("Error actualizando stock en " +
                        "idProducto '"+idProducto+"'");  
        }catch (SQLException e){
            throw new InternalErrorException(e);   
        }
    }



    /* This class can by tested by "SQLProductoDAOFactory". */

}

